[iOS] AVFoundation(AVCaptureMetadataOutput)でバーコードリーダーを作ってみた
1 はじめに
本記事は、AVFoundationを使用しのバーコードの読み取りを紹介するものです。
AVFoundationを使用する場合の共通的な処理については下記に纏めましたので、是非、ご参照下さい。
[iOS] AVFundationを使用して、「ビデオ録画」や「連写カメラ」や「QRコードリーダー」や「バーコードリーダー」を作ってみた
バーコードの規格も多数存在していますが、日本では、標準タイプ(13桁)と短縮タイプ(8桁)の2種類が主に利用されているようです。 本記事のサンプルでは、この2つを検出するため、対象のメタデータタイプをAVMetadataObjectTypeEAN13Code及び、AVMetadataObjectTypeEAN8Codeに設定しています。
2 入出力
QRコードの読み取りを実装する場合、入力として、カメラ(今回は背面)を使用し、出力として、メタデータであるAVCaptureMetadataOutputを設定します。
下記のコードは、セッションを生成して、上記のとおり入出力をセットしている例です。
<br />// セッションのインスタンス生成 let captureSession = AVCaptureSession() // 入力(背面カメラ) let videoDevice = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) let videoInput = try! AVCaptureDeviceInput.init(device: videoDevice) captureSession.addInput(videoInput) // 出力(メタデータ) let metadataOutput = AVCaptureMetadataOutput() captureSession.addOutput(metadataOutput)
3 AVCaptureMetadataOutput
delegateの設定及びmetadataObjectTypesの扱いに付いては、QRで紹介したとおり。
// メタデータを検出した際のデリゲート設定 metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) // EAN-13コードの認識を設定 metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code]
QRコードの読み込みでは、メタデータの検出エリアを取得して枠を表示しましたが、今回は、検出範囲を設定して、その中にターゲットが入ったときだけ検出するようにしてみました。
なお、検出エリアの設定は、ビュー全体対する比率を0〜1.0の範囲で表します。
let x: CGFloat = 0.05 let y: CGFloat = 0.3 let width: CGFloat = 0.9 let height: CGFloat = 0.2 // 検出エリアの設定 metadataOutput.rectOfInterest = CGRect(x: y,y: 1-x-width,width: height,height: width)
サンプルでは、同じ比率を使用して、検出エリアの枠を表示しています。
detectionArea.frame = CGRect(x: view.frame.size.width * x, y: view.frame.size.height * y, width: view.frame.size.width * width, height: view.frame.size.height * height) detectionArea.layer.borderColor = UIColor.red.cgColor detectionArea.layer.borderWidth = 3
4 動作確認
実際に動作している様子です。
5 最後に
コードは下記に置いています。気になるところが有りましたら、ぜひ教えてやってください。
[GitHub] https://github.com/furuya02/AVCaptureMetadataOutputSample_EAN13CodeReader
アイコンは、下記のものを利用させて頂きました。
http://jp.freepik.com/
6 参考資料
API Reference AVCaptureMetadataOutput
[iOS] AVFundationを使用して、「ビデオ録画」や「連写カメラ」や「QRコードリーダー」や「バーコードリーダー」を作ってみた